home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_87 / umbunit.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  4KB  |  134 lines

  1. {****************************************************************************}
  2. {                                                                            }
  3. { MODULE:         UMBUnit                                                    }
  4. {                                                                            }
  5. { DESCRIPTION:    Unit that handles dynamic UMB (above the 640 Kb). It uses  }
  6. {                 the MS-DOS 5.0 LINK/UNLINK interface, so it works only     }
  7. {                 with MS-DOS compatible UMB managers (QEMM and the like).   }
  8. {                 It doesn't really manage UMB's by themselves, but links    }
  9. {                 them to the normal DOS MCB chain, and then uses the normal }
  10. {                 48h/49h INT 21 calls, so lost low-memory fragments are     }
  11. {                 also used (that's a bonus, eh? ;-). Care must be taken if  }
  12. {                 a small TP heap is used, as the unused DOS memory can (and }
  13. {                 will) be mistaken as a UMB, when it's not.                 }
  14. {                                                                            }
  15. {                 Also, an advice: never use a DMA buffer in the UMB space,  }
  16. {                 because it must be virtualized and that slows down the     }
  17. {                 response, and the autoinitialized mode will NEVER work at  }
  18. {                 all.                                                       }
  19. {                                                                            }
  20. { AUTHOR:         Juan Carlos Arévalo                                        }
  21. {                                                                            }
  22. { MODIFICATIONS:  Nobody (yet ;-)                                            }
  23. {                                                                            }
  24. { HISTORY:        12-Feb-1993 Design and implementation.                     }
  25. {                                                                            }
  26. { (C) 1992, 1993 VangeliSTeam                                                }
  27. {____________________________________________________________________________}
  28.  
  29. UNIT UMBUnit;
  30.  
  31. INTERFACE
  32.  
  33.  
  34.  
  35.  
  36. FUNCTION  DOSAllocate (VAR Buf: POINTER; Size: LONGINT) : LONGINT;
  37. PROCEDURE DOSFree     (VAR Buf: POINTER);
  38.  
  39. FUNCTION  UMBLink     (DoLink: BOOLEAN)                 : BOOLEAN;
  40. FUNCTION  UMBAllocate (VAR Buf: POINTER; Size: LONGINT) : LONGINT;
  41. PROCEDURE UMBFree     (VAR Buf: POINTER);
  42.  
  43.  
  44.  
  45.  
  46. IMPLEMENTATION
  47.  
  48.  
  49.  
  50.  
  51. FUNCTION DOSAllocate(VAR Buf: POINTER; Size: LONGINT) : LONGINT;
  52.   VAR
  53.     SizeP    : WORD;
  54.   BEGIN
  55.     SizeP := Size SHR 4;
  56.  
  57.     ASM
  58.  
  59.         MOV    BX,SizeP
  60.         MOV    AH,$48
  61.         INT    21H
  62.         JNC     @@Ok
  63.         MOV    SizeP,BX
  64.         MOV    AH,$48
  65.         INT    21H
  66.         JNC    @@Ok
  67.         MOV     AX,0
  68.         MOV     SizeP,AX
  69. @@Ok:   LES     DI,Buf
  70.         MOV     [ES:DI+2],AX
  71.         XOR     AX,AX
  72.         MOV     [ES:DI],AX
  73.     END;
  74.  
  75.     DOSAllocate := LONGINT(SizeP) SHL 4;
  76.   END;
  77.  
  78.  
  79. PROCEDURE DOSFree(VAR Buf: POINTER); ASSEMBLER;
  80.   ASM
  81.         LES     DI,Buf
  82.         MOV     AX,[ES:DI+2]
  83.         XOR     BX,BX
  84.         MOV     [ES:DI+2],BX
  85.         MOV     [ES:DI],BX
  86.         MOV     ES,AX
  87.         MOV     AH,$49
  88.         INT     $21
  89.   END;
  90.  
  91.  
  92.  
  93.  
  94. FUNCTION UMBLink(DoLink: BOOLEAN) : BOOLEAN; ASSEMBLER;
  95.   ASM
  96.         MOV    AX,$5802
  97.         INT    21H
  98.         MOV    AH,0
  99.         JC    @@Fin
  100.         MOV     AH,AL
  101.         PUSH    AX
  102.         MOV    AX,5803H
  103.         XOR    BH,BH            
  104.         MOV     BL,DoLink
  105.         INT    21H            
  106.         POP     AX
  107. @@Fin:
  108.         MOV     AL,AH
  109.   END;
  110.  
  111.  
  112. FUNCTION UMBAllocate(VAR Buf: POINTER; Size: LONGINT) : LONGINT;
  113.   VAR
  114.     SaveLink : BOOLEAN;
  115.   BEGIN
  116.     SaveLink    := UMBLink(TRUE);
  117.     UMBAllocate := DOSAllocate(Buf, Size);
  118.     UMBLink(SaveLink);
  119.   END;
  120.  
  121.  
  122. PROCEDURE UMBFree(VAR Buf: POINTER);
  123.   VAR
  124.     SaveLink : BOOLEAN;
  125.   BEGIN
  126.     SaveLink := UMBLink(TRUE);
  127.     DOSFree(Buf);
  128.     UMBLink(SaveLink);
  129.   END;
  130.  
  131.  
  132.  
  133.  
  134. END.